package com.yikekong.service.impl;
import com.yikekong.dto.DeviceDTO;
import com.yikekong.es.ESRepository;
import com.yikekong.service.DeviceService;
import com.yikekong.vo.Pager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class DeviceServiceImpl implements DeviceService{


    @Autowired
    private ESRepository esRepository;
    /**
     * 更改设备状态
     * @param deviceId
     * @param status
     * @return
     */
    @Override
    public boolean setStatus(String deviceId, Boolean status) {
        DeviceDTO device = findDevice(deviceId);
        if(device == null) return false;
        return esRepository.updateStatus(deviceId,status);
    }

    /**
     * 更新设备标签
     * @param deviceId
     * @param tags
     * @return
     */
    @Override
    public Boolean updateTags(String deviceId, String tags) {
        return esRepository.updateTags(deviceId,tags);
    }

    /**
     * 分页搜索设备
     * @param page
     * @param pageSize
     * @param sn
     * @param tag
     * @param state
     * @return
     */
    @Override
    public Pager<DeviceDTO> queryPage(Long page, Long pageSize, String sn, String tag, Integer state) {
        return esRepository.searchDevice(page,pageSize,sn,tag,null);
    }

    /**
     * 保存设备信息
     * @param deviceDTO
     * @return
     */
    @Override
    public boolean saveDeviceInfo(DeviceDTO deviceDTO) {
        //查询设备 ，判断开关状态 ，如果是关闭则不处理
        DeviceDTO device= findDevice(deviceDTO.getDeviceId());
        //设备存在，并且是关的状态
        if( device!=null && !device.getStatus() ) return false;

        // 如果当前设备查不到，新增
        if(device==null){
            esRepository.addDevice( deviceDTO );
        }else{
            //如果可以查询到，更新告警信息
            esRepository.updateDevicesAlarm(deviceDTO);
        }
        return true;
    }

    /**
     * 更新状态
     * @param deviceId
     * @param online
     */
    @Override
    public void updateOnLine(String deviceId, Boolean online) {
        //以webclient开头的client为系统前端,monitor开头的是服务端
        if(deviceId.startsWith("webclient") || deviceId.startsWith("monitor")){
            return;
        }
        //更新数据到es
        DeviceDTO deviceDTO = findDevice(deviceId);
        if(deviceDTO == null) return;

        deviceDTO.setOnline(online);
        esRepository.updateOnline(deviceId,online);
    }

    /**
     *  根据设备ID查询设备
     * @param deviceId
     * @return
     */
    private DeviceDTO findDevice(String deviceId){
        DeviceDTO deviceDTO = esRepository.searchDeviceById(deviceId);
        return deviceDTO;
    }
}
